iT邦幫忙

2025 iThome 鐵人賽

DAY 17
0
自我挑戰組

30 天工程師雜學之旅系列 第 17

k8s雜記-5 Kubernetes NetworkPolicy:為什麼我只需要管「請求的發起方向」?

  • 分享至 

  • xImage
  •  

在學 Kubernetes NetworkPolicy 的時候,我曾經有一個困惑:
官方文件告訴我,當我要幫資料庫設定網路政策時,只需要考慮 Ingress 規則(流入的流量),而不需要管 Egress(流出的流量)。

舉例來說:

  • API Server → Database
  • 從資料庫的角度來看,只需要設定允許來自 API Pod 的 Ingress。
  • 而 Database Pod 回應 API Pod 的封包,不需要額外設定 Egress。

這聽起來直覺上有點奇怪:難道回應的流量不用規則保護嗎?


1. NetworkPolicy 的基本概念

在 Kubernetes 裡,NetworkPolicy 用來控制 Pod 與 Pod 之間的通訊。它有兩個方向:

  • Ingress → 進到 Pod 的流量
  • Egress → 從 Pod 出去的流量

預設情況下(完全沒設定 NetworkPolicy),所有 Pod 都能互相溝通。
一旦某個 Pod 被 NetworkPolicy 選中,它的流量就會受到規則限制,任何未被允許的流量都會被封鎖。


2. 為什麼方向取決於「誰發起請求」

這裡有個關鍵:在網路世界裡,連線都是由「客戶端」發起的

  • API Server 是客戶端,它會主動連線到 Database。
  • Database 是伺服器,它只會「監聽」連線,然後回應 API Server 的請求。

換句話說:

  • 只要 Database 的 Ingress 規則允許 API Pod 連進來,Database 的回應就會自動走同一個已建立的連線,不需要再單獨允許 Egress。

這就像防火牆的行為:你允許「連進來的門口」,回應的封包就會被視為同一個 session,不需要額外開門。


3. 一個簡單例子

假設有兩個 Pod:

  • Pod A = API Server
  • Pod B = Database

如果 API 要能存取 DB:

  • DB Pod 上,設定一個 Ingress 規則,允許 API Pod 的流量進來(通常是 TCP 5432 port)。
  • API Pod 上,不需要設定 Egress(除非你想進一步限制 API 只能呼叫特定目的地)。

但如果反過來,DB 也要能主動呼叫 API(比較少見):

  • 這時候 API Pod 需要有 Ingress 規則允許 DB。
  • DB Pod 也要有 Egress 規則允許往 API 發送。

4. 為什麼不用擔心「回應」方向?

因為在 TCP(以及大部分應用層協定)裡:

  1. 客戶端發起連線 → 伺服器接受。
  2. 建立 session 後,所有雙向流量都走在這條連線裡。
  3. 回應被視為「已經允許的連線的一部分」,所以不需要額外規則。

這就呼應了一開始時說的:「你只需要管請求的發起方向。」


5. 一個小比喻

想像你要去某棟大樓:

  • 你需要一張門禁卡才能進去(Ingress)。
  • 進去之後跟櫃檯問問題,櫃檯人員可以回答你,這不需要再辦一張「回應卡」。
  • 因為回應是你主動發起的對話的一部分。

這就是 NetworkPolicy 在處理 TCP session 的邏輯。


6. 總結與實務建議

  • 伺服器型應用(例如 Database、Web Server) → 設定 Ingress 規則就好。
  • 客戶端型應用(例如 API 要呼叫外部服務) → 設定 Egress 規則。
  • 雙向應用(例如兩個 microservices 互相呼叫) → 需要 Ingress + Egress。

📌 判斷規則:誰發起連線,就保護那個方向。

這個觀念對 CKA/CKAD 考試也很重要,因為考題通常會問你怎麼正確寫 NetworkPolicy。


上一篇
k8s雜記-4 Kubernetes Authorization Modes — 為什麼需要多重授權機制?
下一篇
k8s雜記-6 為什麼會有 CRD 與 Operator?
系列文
30 天工程師雜學之旅22
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言